#ifndef PIZZARECIPE_HPP_
# define PIZZARECIPE_HPP_

# include <map>
# include "PizzaIngredients.hpp"
//# include "Pizza.hpp"

namespace pizzeria {

/*! Contains informations for the cooks such as what ingredients is needed to
 * make the pizza or the cooking time
 */
class PizzaRecipe {
public:
  typedef int PizzaType; /*!< Pizza::PizzaType */

  /*! Constructor
   * \param pizzaType : the type of the pizza made with this recipe
   */
  PizzaRecipe(PizzaType pyzzaType);
  /*! Copy constructor
   * \param tocopy : the \a PizzaRecipe object to copy
   */
  PizzaRecipe(const PizzaRecipe &toCopy);
  /* Destructor */
  ~PizzaRecipe();

  /*! Assignment operator
   * \param tocopy : the \a PizzaRecipe object to copy
   */
  PizzaRecipe &operator =(const PizzaRecipe &toCopy);

  /*! Get all the ingredients
   * \return a std::map with each ingredients
   */
  const std::map<PizzaIngredients, bool> &GetIngredients();
  /*! \return true if the pizza needs doe */
  bool IsDoeNeeded() const;
  /*! \return true if the pizza needs tomatoes */
  bool IsTomatoNeeded() const;
  /*! \return true if the pizza needs Gruyere */
  bool IsGruyereNeeded() const;
  /*! \return true if the pizza needs ham */
  bool IsHamNeeded() const;
  /*! \return true if the pizza needs mushroom */
  bool IsMushroomNeeded() const;
  /*! \return true if the pizza needs steak */
  bool IsSteakNeeded() const;
  /*! \return true if the pizza needs eggplant */
  bool IsEggplantNeeded() const;
  /*! \return true if the pizza needs goat cheese */
  bool IsGoatCheeseNeeded() const;
  /*! \return true if the pizza needs chief love */
  bool IsChiefLoveNeeded() const;
  /*! \return the needed cooking time (in us) for this pizza */
  unsigned int GetCookingTime() const;

private:
  void BasicRecipe(); /*!< Set the needed ingredients for a basic pizza */
  void UseRecipeRegina(); /*!< This pizza is a 'Regina' */
  void UseRecipeFantasia(); /*!< This pizza is a 'Fantasia' */
  void UseRecipeMargarita(); /*!< This pizza is a 'Margarita' */
  void UseRecipeAmericaine(); /*!< This pizza is an 'Americaine' */

  /* Needed ingredients */
  std::map<PizzaIngredients, bool> mIngredients;
  float mCookingTime; /*!< Needed cooking time */
};

} /* !namespace pizzeria */
#endif /* !PIZZARECIPE_HPP_ */
